package mysql8学习.高级.第07章_InnoDB数据存储结构存储;

/**
 * 文件头  File Header
 *
 * FIL_PAGE_OFFSET (4字节)  :页号
 *      每一个页都有一个单独的页号，就跟你的身份证号码一样，
 *      InnoDB通过页号可以唯一定位一个页。
 *
 *  FIL_PAGE_PREV (4字节) : 上一页的页号
 *  FIL_PAGE_NEXT (4字节) : 下一页的页号
 *
 *  FIL_PAGE_SPACE_OR_CHKSUM (4字节) : 代表当前页面的校验和(checksum)
 *
 *  FIL_PAGE_LSN (8字节): 页面被最后修改时对应的日志序列位置 (英文名是: Log Sequence Number)
 *
 *
 *  校验和                4
 *    (尾部也有一个校验和 当头和尾一样  说明此页中间没有发生宕机等故障)
 *  页号                  4
 *  上一页的页号            4
 *  下一页的页号            4
 *  页面最后修改时的日志位置   8  (LSN)
 *  页类型                 2
 *  仅在系统表空间的一个页中定义，代表文件至少被刷新到了对应的LSN值  8
 *  页属于哪个表空间         4
 *
 *
 */
public class B1_页的文件头 {
}
/**
 *  页类型
 *  FIL_PAGE_TYPE (2字节)     这个代表当前页的类型。
 *  类型名称                      十六进制       描述
 *  FIL_PAGE_TYPE_ALLOCATED      0x0000       最新分配，还没使用
 *  FIL_PAGE_UNDO_LOG            0x0002       Undo日志页
 *  FIL_PAGE_INODE               0x0003       段信息节点
 *  FIL_PAGE_IBUF_FREE_LIST      0x0004       Insert Buffer 空闲列表
 *  FIL_PAGE_IBUF_BITMAP         0x0005       Insert Buffer位图
 *  FIL_PAGE_TYPE_SYS            0x0006       系统页
 *  FIL_PAGE_TYPE_TRX_SYS        0x0007       事务系统数据
 *  FIL_PAGE_TYPE_FSP_HDR        0x0008       表空间头部信息
 *  FIL_PAGE_TYPE_XDES           0x0009       扩展描述页
 *  FIL_PAGE_TYPE_BLOB           0x000A       溢出页
 *  FIL_PAGE_INDEX               0x45BF       索引页，也就是我们所说的数据页
 *
 */
/**
 * 校验和
 * FIL_PAGE_SPACE_OR_CHKSUM (4字节) : 代表当前页面的校验和(checksum)
 * 什么是校验和?
 * 就是对于一个很长的字节串来说，
 * 我们会通过某种算法来计算一个比较短的值来代表这个很长的字节串，这个比较短的值就称为校验和。
 * 在比较两个很长的字节串之前，先比较这两个长字节串的校验和，如果校验和都不一样，
 * 则两个长字节串肯定是不同的，所以省去了直接比较两个比较长的字节串的时间损耗。
 *
 * 作用:
 *    InnoDB存储引擎以页为单位把数据加载到内存中处理，
 *    如果该页中的数据在内存中被修改了，那么在修改后的某个时间需要把数据同步到磁盘中。
 *    但是在同步了一半的时候断电了，造成了该页传输的不完整。
 *    为了检测一个页是否完整(也就是在同步的时候有没有发生只同步一半的尴尬情况)，
 *    这时可以通过文件尾的校验和(checksum值)与文件头的校验和做比对，
 *    如果两个值不相等则证明页的传输有问题，需要重新进行传输，否则认为页的传输已经完成。
 * 具体的:
 *    每当一个页面在内存中修改了，在同步之前就要把它的校验和算出来，
 *    因为File Header在页面的前边，所以校验和会被首先同步到磁盘，当完全写完时，
 *    校验和也会被写到页的尾部，如果完全同步成功，则页的首部和尾部的校验和应该是一致的。
 *    如果写了一半儿断电了，那么在File Header中的校验和就代表着已经修改过的页，
 *    而在File Trailer中的校验和代表着原先的页，二者不同则意味着同步中间出了错。
 *    这里，校验方式就是采用Hash算法进行校验。
 *
 */
